{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from pycolab.examples.classics import blocking_maze\n",
    "from pycolab.examples.classics import shortcut_maze\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from pycolab.rendering import ObservationToFeatureArray\n",
    "import multiprocessing\n",
    "from collections import deque\n",
    "import math\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "envList = [blocking_maze,shortcut_maze]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def DynaQ(N,env_id, max_steps):\n",
    "    env = envList[env_id]\n",
    "    episode_step = deque()\n",
    "    max_steps= max_steps\n",
    "    epsilon = 0.2\n",
    "    alpha = 0.05\n",
    "    gamma = 0.95\n",
    "    game  = env.make_game()\n",
    "    Qs_a = np.zeros([game.rows*game.cols,4])\n",
    "    position = ObservationToFeatureArray(['!'])\n",
    "    obs_init, reward, _ = game.its_showtime(0)\n",
    "    pos = position(obs_init).flatten()\n",
    "    s_ini = np.where(pos == 1)[0][0]\n",
    "    replay_memory = deque()\n",
    "    all_rewards = deque()\n",
    "    model = {}\n",
    "    for steps in range(max_steps):\n",
    "        action = np.random.choice([np.random.choice(4),np.argmax(Qs_a[s_ini])], p=[epsilon,1-epsilon])\n",
    "        obs_new, reward,_ = game.play(action,steps)\n",
    "        all_rewards.append(reward)\n",
    "        reward -= 0.1\n",
    "        #reward += 0.001*math.sqrt(steps/2)\n",
    "        if game.game_over:\n",
    "            replay_memory.append((s_ini,action))\n",
    "            model[(s_ini, action)] = (reward, None)\n",
    "            Qs_a[s_ini,action] += alpha*(reward - Qs_a[s_ini,action])\n",
    "            game  = env.make_game()\n",
    "            position = ObservationToFeatureArray(['!'])\n",
    "            obs_init, reward, _ = game.its_showtime(0)\n",
    "            pos = position(obs_init).flatten()\n",
    "            s_ini = np.where(pos == 1.)[0][0]\n",
    "        else:\n",
    "            pos_new = position(obs_new).flatten()\n",
    "            s_next = np.where(pos_new == 1.)[0][0]\n",
    "            replay_memory.append((s_ini,action))\n",
    "            model[(s_ini, action)] = (reward, s_next)\n",
    "            Qs_a[s_ini,action] += alpha*(reward +gamma*np.max(Qs_a[s_next])- Qs_a[s_ini,action])\n",
    "            s_ini = s_next\n",
    "        for i in range(N):\n",
    "            s, a = replay_memory[np.random.choice(len(replay_memory))]\n",
    "            r, sprime = model[(s,a)]\n",
    "            if sprime is None:\n",
    "                Qs_a[s,a] += alpha*(r - Qs_a[s,a])\n",
    "            else:\n",
    "                Qs_a[s,a] += alpha*(r + gamma*np.max(Qs_a[sprime])- Qs_a[s,a])\n",
    "    return np.cumsum(all_rewards), model, Qs_a     "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## DynaQ for blocking maze"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 4 ms, sys: 4 ms, total: 8 ms\n",
      "Wall time: 2.69 s\n"
     ]
    }
   ],
   "source": [
    "max_steps = 3000\n",
    "N_array = [(0,0,max_steps) ,(5,0,max_steps) ,(20,0,max_steps)]\n",
    "with multiprocessing.Pool(4) as p:\n",
    "    %time res = p.starmap(DynaQ, N_array)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.text.Text at 0x7f731f71f5f8>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nM7Mc+z+YN85quU4/wQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f731f72fa20>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "for j, r in enumerate(res):\n",
    "    plt.plot(r[0], label=N_array[j])\n",
    "plt.legend()\n",
    "plt.xlabel('Time steps')\n",
    "plt.ylabel('Cumulative Reward')\n",
    "plt.title(\"Performance of Dyna Q for different planning steps for Blocking Maze example\")\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Dyna Q for shortcut maze "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 8 ms, sys: 0 ns, total: 8 ms\n",
      "Wall time: 5.43 s\n"
     ]
    }
   ],
   "source": [
    "steps = 6000\n",
    "N_array = [(0,1,steps) ,(5,1,steps) ,(20,1,steps)]\n",
    "with multiprocessing.Pool(4) as p:\n",
    "    %time res = p.starmap(DynaQ, N_array)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.text.Text at 0x7f731d6097f0>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f731f72fa58>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "for j, r in enumerate(res):\n",
    "    plt.plot(r[0], label=N_array[j])\n",
    "plt.legend()\n",
    "plt.xlabel('Time steps')\n",
    "plt.ylabel('Cumulative Reward')\n",
    "plt.title(\"Performance of Dyna Q for different planning steps for Shortcut Maze example\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## Experimental Observation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this experiment we have implemented the Dyna Q algorithm for both the Blocking Maze and the Shortcut maze example. We have designed both the environments using the pycolab framework where our environment essentially looks as follows"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Blocking Maze Environment"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "GAME_ART = ['###########',\n",
    "            '#        G#',\n",
    "            '#         #', \n",
    "            '#         #',\n",
    "            '#         #',              \n",
    "            '#*#######.#',        \n",
    "            '#   !     #', \n",
    "            '###########']\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "During the first instance, when $t \\leq 1000$ the state . is passable. the goal state is at G and the gate $*$ is impassable. When $t\\geq1000$ the $.$ state becomes impassable and $*$ becomes passable. Hence the  agent which is represented with $!$ have to take a longer route in order to reach the goal state G"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Shortcut Maze Environment "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "GAME_ART = ['###########',\n",
    "            '#        G#',\n",
    "            '#         #', \n",
    "            '#         #',\n",
    "            '#         #',              \n",
    "            '#*#######.#',        \n",
    "            '#   !     #', \n",
    "            '###########']\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The shortcut maze also has a similar game art except for the fact that gate $.$ is initially closed and gate $*$ is opened. When $t\\geq 3000$ both the gates $*$ and $.$ are opened. Hence there exist a shortcut path to the goal state after 3000 timesteps"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this experiment we have observed that for the blocking maze environment, learning stopped whenever the gate\n",
    "that corresponds to the shortest path that the agent could take closes. This is due to the fact that since a \n",
    "reward of +1 is only obtained at the goal state,  when the gate is closed, the Q values corresponding to that \n",
    "particular state is not updated after t=1000. This happens because the agent never comes across that state\n",
    "since that path essentially gets blocked. However there needs to be some mechanism so that each time the agent \n",
    "tries to reach close to the blocked state, the Q values corresponding to it gets penalized. We observed that \n",
    "this can be done using reward shaping where we have added a reward of -0.1 for every step that the agent takes\n",
    "with in the environment.We do not include this reward in the cumulative reward plot, instead this reward essentially penalizes the Q values."
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
